package Persistencia;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import Model.*;

public class AdministradorPersistenciaPromociones {
	
	private static AdministradorPersistenciaPromociones instancia;
	
	public static AdministradorPersistenciaPromociones getInstancia()
	{
		if (instancia== null)
			instancia =new AdministradorPersistenciaPromociones();
		return instancia;
	}
	
	public AdministradorPersistenciaPromociones() {
		// TODO Auto-generated constructor stub
	}
	
	public int insert(Promocion p)
	{ 
		int newId=0;
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		String senten = null;
		String senten2 = null;
		try
		{					
			
			senten = "INSERT INTO promociones (nombre, activa, descuento, combinable, prioridad, tipo) VALUES (?,?,?,?,?,?)" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten, Statement.RETURN_GENERATED_KEYS);
			ps.setString(1, p.getNombre());
			ps.setBoolean(2, p.getEstaActiva());
			ps.setDouble(3, p.getDescuentoValor());
			ps.setBoolean(4, p.getEsCombinable());
			ps.setInt(5,p.getPrioridad());
			Class cls = p.getClass();
			ps.setString(6, cls.getName());			
			ps.execute();
			ResultSet  generatedKeys = ps.getGeneratedKeys();
			if(generatedKeys.next())
			{	
				newId = generatedKeys.getInt(1);
			}
			if (cls.getName().equals("Model.PromocionCombo"))
			{
				PreparedStatement ps2 = null;
				PromocionCombo pc = (PromocionCombo)p;
				for(int i=0; i<pc.getPromociones().size(); i++)
				{					
					senten2 = "INSERT INTO ComboPromociones (idCombo,idPromocion) VALUES (?,?)" ;
					ps2 = con.prepareStatement(senten2);
					ps2.setInt(1, newId);
					ps2.setInt(2, pc.getPromociones().get(i).getId());
					ps2.execute();
				}
			}
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			return newId;
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al Insertar Promocion: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
				return newId;
	      }
	      
	}
	public void update(Promocion p)
	{ 
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		String senten = null;
		String senten2 = null;
		String senten3 = null;
		try
		{
			senten = "UPDATE promociones SET nombre = ?,activa = ?,descuento = ?,combinable = ?, prioridad = ?, tipo = ? WHERE id = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1, p.getNombre());
			ps.setBoolean(2, p.getEstaActiva());
			ps.setFloat(3, p.getDescuentoValor());
			ps.setBoolean(4, p.getEsCombinable());
			ps.setInt(5,p.getPrioridad());	
			Class cls = p.getClass();
			ps.setString(6, cls.getName());
			ps.setInt(7,p.getId());	
			ps.execute();
			if (cls.getName().equals("Model.PromocionCombo"))
			{				
				PreparedStatement ps2 = con.prepareStatement(senten2);
				senten2 ="DELETE from ComboPromociones WHERE idCombo = ?";
				ps2.setInt(1,p.getPrioridad());	
				ps2.execute();
				
				PreparedStatement ps3 = con.prepareStatement(senten3);
				PromocionCombo pc = (PromocionCombo)p;
				for(int i=0; i<pc.getPromociones().size(); i++)
				{
					senten3 = "INSERT INTO ComboPromociones (idCombo,idPromocion) VALUES (?,?)" ;
					ps3.setInt(1, p.getId());
					ps3.setInt(2, pc.getPromociones().get(i).getId());
					ps3.execute();
				}
			}		
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al acutalizar Promocion: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	      
		
	}

	public Promocion getPromcion(int id)
	{
		Promocion p = null; 
		PromocionCombo pc = null;
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		
		try
		{
			String senten = "SELECT id, nombre, activa, descuento, combinable, prioridad, tipo from promociones where id = ?" ;
			PreparedStatement ps = con.prepareStatement(senten);
			ps.setInt(1,id);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{				
				if(result.getString("tipo").equals("Model.PromocionBanco"))
				{
						p = new PromocionBanco(result.getInt("id")
								, result.getString("nombre")
								, result.getFloat("descuento")
								, result.getBoolean("activa")
								, result.getInt("prioridad")
								, result.getBoolean("combinable"));
				}
				else if (result.getString("tipo").equals("Model.PromocionClub"))					
				{
						p = new PromocionClub(result.getInt("id")
								, result.getString("nombre")
								, result.getFloat("descuento")
								, result.getBoolean("activa")
								, result.getInt("prioridad")
								, result.getBoolean("combinable"));
				}
				else if (result.getString("tipo").equals("Model.PromocionTarjeta"))
				{
						p = new PromocionTarjeta(result.getInt("id")
								, result.getString("nombre")
								, result.getFloat("descuento")
								, result.getBoolean("activa")
								, result.getInt("prioridad")
								, result.getBoolean("combinable"));					
				}	
				else if (result.getString("tipo").equals("Model.PromocionCombo"))
				{
						pc = new PromocionCombo(result.getInt("id")
								, result.getString("nombre")
								, result.getFloat("descuento")
								, result.getBoolean("activa")
								, result.getInt("prioridad")
								, result.getBoolean("combinable"));
						
						String senten2 = "SELECT idPromocion FROM ComboPromociones where idcombo = ?";
						PreparedStatement ps2 = con.prepareStatement(senten2);
						ps2.setInt(1, pc.getId());
						ResultSet result2 = ps2.executeQuery();
						while (result2.next())
						{
							pc.add(this.getPromcion(result2.getInt("idPromocion")));
						}	
				}	
			}
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			if(pc==null)
			{
				return p;
			}
			else
			{
				return pc;
			}
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al consultar promocion: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	      return p;
	}
	public ArrayList<Promocion> getPromociones()
	{
		Promocion p = null; 
		PromocionCombo pc = null;
		ArrayList<Promocion> listaPromociones = new ArrayList<Promocion>();
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		
		try
		{
			String senten = "SELECT id, nombre, activa, descuento, combinable, prioridad, tipo from promociones" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{				
				if(result.getString("tipo").equals("Model.PromocionBanco"))
				{
						p = new PromocionBanco(result.getInt("id")
								, result.getString("nombre")
								, result.getFloat("descuento")
								, result.getBoolean("combinable")
								, result.getInt("prioridad")
								, result.getBoolean("combinable"));
						listaPromociones.add(p);
				}
				else if (result.getString("tipo").equals("Model.PromocionClub"))					
				{
						p = new PromocionClub(result.getInt("id")
								, result.getString("nombre")
								, result.getFloat("descuento")
								, result.getBoolean("combinable")
								, result.getInt("prioridad")
								, result.getBoolean("combinable"));
						listaPromociones.add(p);
				}
				else if (result.getString("tipo").equals("Model.PromocionTarjeta"))
				{
						p = new PromocionTarjeta(result.getInt("id")
								, result.getString("nombre")
								, result.getFloat("descuento")
								, result.getBoolean("combinable")
								, result.getInt("prioridad")
								, result.getBoolean("combinable"));
						listaPromociones.add(p);
				}	
				else if (result.getString("tipo").equals("Model.PromocionCombo"))
				{
						pc = new PromocionCombo(result.getInt("id")
								, result.getString("nombre")
								, result.getFloat("descuento")
								, result.getBoolean("combinable")
								, result.getInt("prioridad")
								, result.getBoolean("combinable"));
						
						String senten2 = "SELECT idPromocion FROM ComboPromociones where idcombo = ?";
						PreparedStatement ps2 = con.prepareStatement(senten2);
						ps2.setInt(1, p.getId());
						ResultSet result2 = ps2.executeQuery();
						while (result2.next())
						{
							pc.add(this.getPromcion(result2.getInt("idPromocion")));
						}	
						listaPromociones.add(pc);
				}	
			}
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			return listaPromociones;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al consultar Promocion: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	      return listaPromociones;
	}

}
